package com.example.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.domain.BorrowRecord;
import com.example.dto.BorrowBookDTO;
import com.example.dto.ReturnRequestDTO;
import com.example.util.Result;
import com.example.vo.BorrowRecordVO;

import java.util.List;

/**
* @author HP
* @description 针对表【borrow_record】的数据库操作Service
* @createDate 2025-08-18 19:32:56
*/
public interface BorrowService extends IService<BorrowRecord> {

    /**
     * 归还图书
     * @param returnRequestDTO 归还信息
     * @return 是否归还成功
     */
    Result returnBook(ReturnRequestDTO returnRequestDTO);

    /**
     * 根据用户ID查询借阅记录
     * @param userId 用户ID
     * @return 借阅记录列表
     */
    List<BorrowRecord> getBorrowRecordsByUserId(Long userId);

    /**
     * 根据用户ID查询借阅记录（带书名信息）
     * @param userId 用户ID
     * @return 借阅记录VO列表
     */
    List<BorrowRecordVO> getBorrowRecordsWithBookInfoByUserId(Long userId);

    /**
     * 根据图书ID查询借阅记录
     * @param bookId 图书ID
     * @return 借阅记录列表
     */
    List<BorrowRecord> getBorrowRecordsByBookId(Long bookId);

    /**
     * 查询所有逾期未还的借阅记录
     * @return 逾期借阅记录列表
     */
    List<BorrowRecord> getOverdueBorrowRecords();
    
    /**
     * 续借图书
     * @param borrowId 借阅记录ID
     * @param days 续借天数
     * @param operatorId 操作人ID
     * @param operatorName 操作人名称
     * @param ip IP地址
     * @return 是否续借成功
     */
    boolean renewBook(Long borrowId, int days, Long operatorId, String operatorName, String ip);
    
    /**
     * 获取用户当前借阅数量
     * @param userId 用户ID
     * @return 当前借阅数量
     */
    int getUserCurrentBorrowCount(Long userId);
    
    /**
     * 检查用户是否可以借阅指定图书
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 检查结果信息
     */
    String checkBorrowEligibility(Long userId, Long bookId);

    /**
     * 根据图书ID获取可用的图书副本
     * @param bookId 图书ID
     * @return 可用的图书副本ID，如果没有可用副本则返回null
     */
    Long getAvailableBookCopyId(Long bookId);

    /**
     * 通过图书副本ID借阅图书
     * @param borrowBookDTO 借阅信息
     * @return 是否借阅成功
     */
    Result borrowBook(BorrowBookDTO borrowBookDTO);

    /**
     * 获取图书副本的借阅状态
     * @param bookCopyId 图书副本ID
     * @return 借阅状态描述
     */
//    String getBookCopyBorrowStatus(Long bookCopyId);
}
